package Top_Interview_Questions.String;

/**
 * @Author: 吕庆龙
 * @Date: 2020/3/15 10:57
 * <p>
 * 功能描述:
 */
public class _0038 {

    public static void main(String[] args) {
        _0038 test = new _0038();
        test.countAndSay(5);
    }

    /**
     * 解题思路：
     * 本题的难点在于：报数的概念理解，至少我从题意中没有很清晰的理解，但是感觉像是个递推式
     * 从4->5分析，将4个每一位拆开看（个数+数字），4=1211 => 1=11，2=12，11=21，所以5=111221
     * 所以解题用循环，从1->n可求解出来
     *
     * 给一个数，这个数是1
     * 描述上一步的数，这个数是 1 即一个1，故写作11
     * 描述上一步的数，这个数是11即两个1，故写作21
     * 描述上一步的数，这个数是21即一个2一个1，故写作12-11
     * 描述上一步的数，这个数是1211即一个1一个2两个1，故写作11-12-21
     */
    public String countAndSay(int n) {
        String str = "1";
        for (int i = 2; i <= n; i++) {
            StringBuilder builder = new StringBuilder();
            char pre = str.charAt(0);
            int count = 1;
            for (int j = 1; j < str.length(); j++) {
                char c = str.charAt(j);
                if (c == pre) {
                    count++;
                } else {
                    builder.append(count).append(pre);
                    pre = c;
                    count = 1;
                }
            }
            builder.append(count).append(pre);
            str = builder.toString();
        }

        return str;
    }

}
